// 基础URL，根据实际项目修改
const baseUrl = 'http://localhost:3000';

/**
 * 小程序request请求封装
 * @param {Object} options - 请求配置
 * @param {string} options.url - 请求路径（相对路径）
 * @param {string} [options.method='GET'] - 请求方法
 * @param {Object} [options.data] - 请求数据
 * @param {Object} [options.header] - 请求头
 * @param {boolean} [options.showLoading=true] - 是否显示加载中提示
 * @param {string} [options.loadingText='加载中...'] - 加载提示文本
 * @returns {Promise} - 返回Promise对象
 */
const request = (options) => {
  // 默认配置
  const defaults = {
    method: 'GET',
    header: {
      'Content-Type': 'application/json',
      // 可以添加默认的token等信息
      // 'Authorization': 'Bearer ' + wx.getStorageSync('token')
    },
    showLoading: true,
    loadingText: '加载中...',
    ...options
  };

  // 显示加载提示
  if (defaults.showLoading) {
    wx.showLoading({
      title: defaults.loadingText,
      mask: true
    });
  }

  // 请求拦截器：可以在这里统一处理请求参数
  const requestInterceptor = (config) => {
    // 例如：添加token
    const token = wx.getStorageSync('token');
    if (token) {
      config.header.Authorization = `Bearer ${token}`;
    }
    return config;
  };

  // 响应拦截器：统一处理响应结果
  const responseInterceptor = (response) => {
    // 处理不同的响应状态码
    switch (response.statusCode) {
      case 200:
      case 201:
        // 成功状态，直接返回数据
        return response.data;
      case 401:
        // 未授权，可能需要重新登录
        wx.showToast({
          title: '登录已过期，请重新登录',
          icon: 'none',
          duration: 2000
        });
        // 跳转到登录页
        setTimeout(() => {
          wx.redirectTo({
            url: '/pages/login/login'
          });
        }, 2000);
        return Promise.reject(new Error('未授权'));
      default:
        // 其他错误状态
        wx.showToast({
          title: response.data?.message || `请求失败: ${response.statusCode}`,
          icon: 'none',
          duration: 2000
        });
        return Promise.reject(new Error(response.data?.message || '请求失败'));
    }
  };

  // 处理请求配置
  let url = defaults.url;
  // 确保URL格式正确
  if (!url.startsWith('/')) {
    url = '/' + url;
  }
  
  const config = requestInterceptor({
    url: baseUrl + url,
    method: defaults.method,
    data: defaults.data,
    header: defaults.header
  });

  return new Promise((resolve, reject) => {
    wx.request({
      ...config,
      success: (res) => {
        try {
          const result = responseInterceptor(res);
          resolve(result);
        } catch (error) {
          reject(error);
        }
      },
      fail: (err) => {
        // 网络错误处理
        wx.showToast({
          title: '网络错误，请稍后重试',
          icon: 'none',
          duration: 2000
        });
        reject(err);
      },
      complete: () => {
        // 隐藏加载提示
        if (defaults.showLoading) {
          wx.hideLoading();
        }
      }
    });
  });
};

export default request;